跳到主要内容

Linux jobs 后台进程管理

什么是工作管理?

在只有一个 bash 的环境下,如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,最简单的方法就是利用 & 这个玩意儿了

$ tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432

在该指令的最后面加上一个 & 代表将该指令丢到背景中, 此时 bash 会给予这个指令一个“工作号码(job number)”

在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的, 所以,我们会无法看到提示字符,所以一般需要设置重定向

$ tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &

输出的信息都给他传送到 /tmp/log.txt 当中

后台进程管理命令汇总 ⭐

command &   # 直接在后台运行程序
ctrl + c # 退出前台的命令,不再执行
ctrl + z # 挂起前台命令暂停执行,回到shell命令行环境中
bg # 将刚挂起的命令放到后台运行
bg %3 # 将第三个job放到后台运行
kill %3 # 杀死第三个job,不再执行
fg # 将刚挂起的命令返回前台运行
fg %3 # 将第三个job返回前台运行
jobs # 察看当前 shell 下运行的所有程序;带 + 表示最新的 jobs;带 - 表示次新的 jobs;其他 jobs 不带符号

jobs 显示后台进程

jobs 命令用于显示 Linux 中的任务列表及任务状态,包括后台运行的任务。

该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。

jobs
-l:显示进程号;
-p:仅任务对应的显示进程号;
-n:显示任务状态的变化;
-r:仅输出运行状态(running)的任务;
-s:仅输出停止状态(stoped)的任务。

这里显示的就是挂在后台的进程

fg 命令(后台转前台)

使用 fg 命令将任务号为 1 的任务从后台执行转换到前台执行,输入如下命令:

fg %[number] 指令把一个程序掉到前台

fg %1          #将任务转换到前台执行

也可以直接终止后台运行的程序,使用 kill 命令

kill %1

bg 命令(挂后台)

bg 命令用于将作业放到后台运行,使前台可以执行其他任务。

该命令的运行效果与在指令后面添加符号 & 的效果是相同的,都是将其放到系统后台执行。

使用方式是先使用 ctrl + z 把任务暂停(挂起),然后再使用 jobs 查看它的任务号,然后再使用它将其挂在后台继续执行

nohup 不挂断 ⭐

参考资料 Linux之后台执行命令:nohup和&的使用

nohup 是 no hungup 的缩写,即 “不挂断”,在使用 Xshell 等工具执行 Linux 脚本时,有时候会由于网络问题,导致失去连接,终端断开,程序运行一半就意外结束了。这种时候,就可以用 nohup 指令来运行指令,使程序可以忽略挂起信号继续运行。

nohup Command [ Arg ... ] [ & ]

nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

nohup 会把进程打印的东西默认输出到 $HOME/nohup.out 文件中

作业在后台运行的时候,可以把输出重定向到某个文件中,相当于一个日志文件,记录运行过程中的输出。使用方法:

nohup command > out.file 2>&1 &

command>out.file 是将 command 的输出重定向到 out.file 文件,即输出内容不打印到屏幕上,而是输出到 out.file 文件中。

这里的数字代表的意思:

  • 0 – stdin (standard input)
  • 1 – stdout (standard output)
  • 2 – stderr (standard error) ;

而在上面的例子中 2>&1 是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到 out.file 文件中。

nohup 和 & 的区别

&:是指在后台运行,但是当用户退出(挂起)的时候,命令自动跟着结束

nohup:不挂断的运行,注意并没有后台运行的功能,就是指用 nohup 运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开 SSH 连接都不会影响他的运行,注意了 nohup 没有后台运行的意思;& 才是后台运行

例如:

nohup ./hello &

此时默认地程序运行的输出信息放到当前文件夹的 nohup.out 文件中去,加不加 & 并不会影响这个命令。只是让程序前台或者后台运行而已

使用例子

sh test.sh &

sh test.sh 任务放到后台 ,关闭 xShell,对应的任务也跟着停止

nohup sh test.sh

sh test.sh 任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的 nohup.out 文件,即使关闭 xShell 退出当前 session 依然继续运行(如果不懂的话,可以直接复制上一节的例子代码)

nohup sh test.sh &

sh test.sh 任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的 nohup.out 文件,即使关闭 xShell 退出当前 session 依然继续运行

补充:jps 显示 Java 进程

jps 是 jdk 提供的一个 查看当前 java 进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写。

-q:      仅输出 VM 标识符,不包括classname,jar name,arguments in main method 
-m: 输出 main method 的参数 
-l: 输出完全的包名,应用主类名,jar 的完全路径名 
-v: 输出jvm参数 
-V: 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 
-Joption:传递参数到vm,例如:-J-Xms512m

References

16.2 工作管理 (job control)